import password as password
import sms
from flask import request, current_app, abort, make_response, jsonify, session, g

from info import redis_store, constants, db
from info.modules.passport import passport_blu
from info.response_code import RET
from info.models import User
from info.utils.captcha.captcha import captcha
import re
import random
import time

from info.utils.common import user_login_data


@passport_blu.route('/image_code')
def get_image_code():
    '''
    生成图片验证码
    :return:
    '''
    # 1. 获取参数
    # 2. 校验参数
    # 3. 生成图片验证码
    # 4. 保存图片验证码
    # 5.返回图片验证码
    image_code_id = request.args.get('image_Code')
    if not image_code_id:
        abort(403)
    name, text, image = captcha.generate_captcha()
    print("图片验证码是：{}".format(text))
    try:
        redis_store.setex('image_code_%s'%image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)
    except Exception as e:
        current_app.logger.error(e)
    response=make_response(image)
    response.headers["Content-Type" ] = 'image/png'
    return response

@passport_blu.route('/sms_code', methods=["GET","POST"])
def send_sms_code():
    """
    发送短信的逻辑
    :return:
    """
    # 1.将前端参数转为字典
    image_code_id = request.json.get('image_code_id')
    mobile = request.json.get('mobile')
    image_code = request.json.get('image_code')
    if not all([mobile,image_code,image_code_id]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不全")
    # 2. 校验参数(参数是否符合规则，判断是否有值)
    # 判断参数是否有值
    if not re.match(r'\d+', mobile):
        return jsonify(errno=RET.PARAMERR,errmsg="请输入正确的手机号")
    # 3. 先从redis中取出真实的验证码内容
    redis_image_code = redis_store.get("image_code_"+image_code_id)
    if not redis_image_code:
        return jsonify(errno=RET.NODATA,errmsg='图片验证码过期')

    # 4. 与用户的验证码内容进行对比，如果对比不一致，那么返回验证码输入错误
    if  redis_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.PARAMERR,errmsg="验证码错误！")
    # 5. 如果一致，生成短信验证码的内容(随机数据)
    sms_code = '%06d' % random.randint(0, 999999)

    # 6. 发送短信验证码

    # status_code = CCP().send_template_sms(mobile, [random_sms, 2], 1)
    # if status_code != 0:
    #     return jsonify(errno=RET.THIRDERR, errmsg='第三方系统错误')
    # 保存验证码内容到redis
    redis_store.setex("SMSCode_"+mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
    # 7. 告知发送结果
    print('图片验证码为：%s'%sms_code)
    return jsonify(errno=RET.OK,errmsg='发送短信成功')
@passport_blu.route('/register', methods=["GET","POST"])
def register():
    """
    注册功能
    :return:
    """
    # 1. 获取参数和判断是否有值
    mobile = request.json.get('mobile')
    password=request.json.get("password")
    smscode=request.json.get("smscode")
    if not all([mobile, password,smscode]):
        return jsonify(errno=RET.PARAMERR, errmsg='请输入参数')
    # 2. 从redis中获取指定手机号对应的短信验证码
    redis_sms_code=redis_store.get('SMSCode_'+mobile)
    user=User.query.filter(User.mobile==mobile).first()
    if user:
         return jsonify(errno=RET.DATAEXIST, errmsg="数据已存在")
    if not redis_sms_code:
        return jsonify(errno=RET.NODATA,eremsg='短信验证码过期')
    if redis_sms_code!=smscode:
        return jsonify(errno=RET.PARAMERR,errmsg='短信验证码错误')
    user=User()
    user.mobile=mobile
    user.nick_name=mobile
    user.password = password
    db.session.add(user)
    db.session.commit()
    return jsonify(errno=RET.OK,errmsg='注册成功！')
    # 3. 校验验证码
    # 4. 初始化 user 模型，并设置数据并添加到数据库
    # 5. 保存用户登录状态
    # 6. 返回注册结果
@passport_blu.route('/login', methods=["POST"])
def login():
    """
    登陆功能
    :return:
    """

    # 1. 获取参数和判断是否有值
    mobile=request.json.get('mobile')
    password=request.json.get('password')
    if not all([mobile,password]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不全")
    if not re.match(r'\d+',mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="请输入正确的手机号")
    # 2. 从数据库查询出指定的用户
    user=User.query.filter(User.mobile==mobile).first()
    if not user:
        return jsonify(errno=RET.NODATA, errmsg="无用户数据")
    # 3. 校验密码
    if not user.check_password(password):
        return jsonify(errno=RET.PARAMERR, errmsg="密码不对")
    # 4. 保存用户登录状态
    session['user_id']=user.id
    session['user_nickname']=user.nick_name
    session['user_mobile']=user.mobile
    return jsonify(errno=RET.OK,errmsg='登陆成功！')
    # 5. 登录成功返回

@passport_blu.route("/logout", methods=['POST'])
def logout():
    """
    清除session中的对应登录之后保存的信息
    :return:
    """
    session.clear()
    return jsonify(errno=RET.OK,errmsg="退出成功！")
    # 返回结果